package it.polimi.traveldream.ejb;




import it.polimi.traveldream.ejb.management.PPrenotatiDTO;
import it.polimi.traveldream.ejb.management.UserDTO;
import it.polimi.traveldream.ejb.management.UserMgr;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

import javax.annotation.Resource;
import javax.annotation.security.RolesAllowed;
import javax.ejb.EJBContext;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Session Bean implementation class UserBean
 */
@Stateless
public class BeanUtente implements UserMgr {

	@PersistenceContext
    private EntityManager em;
	
	@Resource
	private EJBContext context;
	
	private BeanPrenotazione beanPrenot;
	

	@Override
	public void save(UserDTO user) {
		Utente newUser = new Utente(user);
		List<Gruppo> groups = new ArrayList<Gruppo>();
		groups.add(Gruppo.CLIENTE);
		newUser.setGroups(groups);
		em.persist(newUser);
	}


	@Override
	@RolesAllowed({Gruppo._CLIENTE,Gruppo._IMPIEGATO})
	public void updatePassword(UserDTO user) {
		Query query = em.createNamedQuery(Utente.MOD_PASS);
		query.setParameter(1, user.getPassword());
		query.setParameter(2, user.getEmail());
		query.executeUpdate();
	}


	@Override
	@RolesAllowed({Gruppo._CLIENTE,Gruppo._IMPIEGATO})
	public UserDTO getUserDTO() {
		UserDTO userDTO = convertToDTO(getPrincipalUser());
		return userDTO;
	}


	@Override
	@RolesAllowed({Gruppo._CLIENTE})
	public void unregister() {
		remove(getPrincipalUser());
	}


	public Utente find(String email) {
    	return em.find(Utente.class, email);
    }
    
    public List<Utente> getAllUsers() {
    	return em.createNamedQuery(Utente.FIND_ALL, Utente.class)
                .getResultList();
    }

    public void remove(String email) {
		Utente user = find(email);
        em.remove(user);
	}
    
    public void remove(Utente user) {
    	em.remove(user);
	}
    
    
    
    public Utente getPrincipalUser() {
    	return find(getPrincipalEmail());
    }
	
    
    public String getPrincipalEmail() {
    	return context.getCallerPrincipal().getName();
    }

    private UserDTO convertToDTO(Utente utente) {
		UserDTO userDTO = new UserDTO();
		userDTO.setEmail(utente.getMail());
		userDTO.setFirstName(utente.getNome());
		userDTO.setLastName(utente.getCognome());
		return userDTO;
	}


	@Override
	public List<PPrenotatiDTO> getPrenotazioni() {
		List<PacchettiPrenotati> list = getPrincipalUser().getPartecipaziones();
		List<PPrenotatiDTO> ret = new ArrayList<PPrenotatiDTO>();
		for (PacchettiPrenotati p : list) {
			ret.add(convertToDTO(p));
		}
		return ret;
	}
	
	private PPrenotatiDTO convertToDTO(PacchettiPrenotati pacc) {
		PPrenotatiDTO ret = new PPrenotatiDTO();
		ret.setIdescursione(pacc.getIdescursione());
		ret.setIdhotel(pacc.getIdhotel());
		ret.setDataPartenza(pacc.getDataPartenza());
		ret.setDataRitorno(pacc.getDataRitorno());
		ret.setLuogo(pacc.getLuogo());
		ret.setNomePacchetto(pacc.getNomePacchetto());
		ret.setIdprenotazione(pacc.getIdprenotazione());
		ret.setIdvoloandata(pacc.getIdvoloandata());
		ret.setIdvoloritorno(pacc.getIdvoloritorno());
		ret.setMailutente(getPrincipalUser().getMail());
		return ret;
	}
	
	@Override
	public List<String> listaMailUtenti() {
		Query query=em.createNamedQuery(Utente.LISTAMAIL,Utente.class);
		List<String> listamail=castList(String.class,query.getResultList());
	return listamail;
	}
	
	private static <T> List<T> castList(Class<? extends T> clazz, Collection<?> c) {
	    List<T> r = new ArrayList<T>(c.size());
	    for(Object o: c)
	      r.add(clazz.cast(o));
	    return r;
	}


	
	
}
